Einführung in R

Jannis Bosch

Welche Programme benötigen wir?

R

  • R ist eine Programmiersprache, die vor allem im Bereich der Statistik verwendet wird

  • die Kernprogrammiersprache (core R) wird durch verschiedenste Bibliotheken, Erweiterungen und Weiterentwicklungen verfeinert

  • R ist open source und freie Software

RStudio

  • RStudio ist eine Entwicklungsumgebung für R

  • RStudio stellt die Nutzer:innenoberfläche und beinhaltet Tools wie einen Viewer, Code-highlighting und vieles mehr

RStudio

Übersicht

R Workflow

R Projekte

  • Wenn ihr ein neues Projekt in R angeht, erstellt ein R-Projekt in einem neuen Ordner (File -> New Project)

  • Damit habt ihr den Arbeitspfad als Ausgangspunkt festgelegt und könnt alle Pfadangaben relativ zum Ausgangspunkt festlegen

  • Ihr habt außerdem die Möglichkeit eure Arbeitsumgebung für die nächste Session zu speichern

R Skripte

  • Erstellt jetzt in eurem Projektordner ein R-Skript und öffnet es

  • R-Skripte sind letztendlich einfach Textdateien, die euren Code enthalten

  • Ihr könnt entweder den kompletten Code zusammen ausführen oder einzelne Zeilen/Abschnitte

Die R Konsole

  • In der Konsole könnt ihr Code ausführen, den ihr nicht für später speichern möchtet

  • Die Ausgabe wird dann ebenfalls in der Konsole angezeigt

  • Wenn ihr den Code eines Skripts ausführt, dann findet ihr die Ausgaben ebenfalls in der Konsole

Die aRbeitsumgebung

  • Wenn ihr Daten in Variablen speichert, könnt ihr diese danach in der Arbeitsumgebung sehen

  • Aktuell sollte eure Arbeitsumgebung noch leer sein

R-Code

R-Code kommentieren

# Mit dem Raute-Zeichen (#) werden Kommentarzeilen markiert
# Der Text in Kommentarzeilen dient nur als 
# Anmerkung und wird von R nicht ausgefuehrt

# Es ist meist hilfreich seinen eigenen Code zu kommentieren, 
# damit man ihn auch später noch versteht

Einfache Berechnungen

  • Die Zeilen in der Box sind der Code, dazwischen findet ihr die jeweilige Ausgabe
# Die Grundrechenarten in R: 
# Addition + 
# Subtraktion - 
# Multiplikation * 
# Division /

(3*3-6)/3+10441 
[1] 10442
3*3-6/3+10441
[1] 10448
# R berechnet Punkt- vor Strichrechnung
  • Rechts oben in jeder Box findet ihr einen Button, der den Code kopiert

Ein kurzer Hinweis für dieses Tutorial

  • Übertragt die Inhalte jeder Box dieses Tutorials in euer geöffnetes Skript

  • Führt den Inhalt jedes Skripts einzeln aus (Strg + Enter bzw. Strg + R) und versucht dabei jeweils darauf zu achten wie sich die Variablen in der Arbeitsumgebung verändern

  • Dabei wird jeweils die komplette Zeile, in der sich der Cursor befindet, ausgeführt (oder der markierte Text)

  • Falls ihr eine Fehlermeldung ausgespuckt bekommt, sagt einfach bescheid!

Variablen deklarieren

  • Um die Arbeitsumgebung zu füllen, deklarieren wir jetzt ein paar Variablen
# Um das Ergebnis einer Berechnung zu speichern, kann es in einer Variable festgehalten werden
# Es gibt zwei Wege einer Variable einen Wert zuzuweisen:
Nummer <- 3
Nummer = 3
# = und <- haben in diesem Fall die gleiche Funktion


# Um das Ergebnis spaeter aufzurufen, muss lediglich der Variablenname ausgefuehrt werden
# In der Konsole wird dann der Befehl erneut angezeigt, gefolgt vom Wert der Variable
Nummer
[1] 3

Variablen deklarieren

  • Groß- und Kleinschreibung unbedingt beachten!
Nummer <- 3
NuMmEr <- 4

Nummer
[1] 3
NuMmEr
[1] 4

Variablenklassen

  • Daten und Variablen können unterschiedliche Klassen haben
Number <- 3

Character <- "Hallo"

Logical <- TRUE
Logical <- T
# Dies sind fuers Erste die wichtigsten Variablenklassen

# Wenn ich den selben Variablennamen zweimal verwende, 
# wird der erste Wert ueberschrieben
Logical <- FALSE

Logical
[1] FALSE

  • Fuer Interessierte: Mehr Informationen zu Datentypen gibt es hier (Kapitel 3.6 fuer dataframes):
    Advanced R - Vectors

R-Funktionen

R-Funktionen

  • R-Funktionen werden durch runde Klammern gekennzeichnet

  • Funktionen können unterschiedlich viele Eingabe- und Ausgabeargumente haben

  • Die Funktion mean() berechnet z.B. den Mittelwert aus einer Reihe numerischer Daten

  • Mit einem ? vor dem Funktionsnamen könnt ihr mehr über die jeweilige Funktion erfahren

?mean

Werte zu Vektoren kombinieren

# Variablen koennen auch mehr als einen Wert beinhalten 
# (Datenreihen / Arrays / Vektoren und Matrizen)
# Mithilfe der combine Funktion c() können mehrere Werte zu einem Vektor verbunden werden

MyVector <- c(1,2,3)
MyVector
[1] 1 2 3
# Mit der mean() Funktion kann man dann z.B. den Mittelwert berechnen
mean(MyVector)
[1] 2

Mehrere Eingabeargumente

mean(MyVector)
[1] 2
# In diesem Fall ist das Eingabeargument eine Datenreihe (1,2,3) 
# und das Ausgabeargument der zugehörige Mittelwert

MyNewVector <- c(1,2,3,NA)
# Bei NA-Werten funktioniert die mean-Funktion nicht
mean(MyNewVector)
[1] NA
# Ein zweites Eingabeargument schafft Abhilfe
mean(x = MyNewVector, na.rm = T)
[1] 2

Ergebnisse speichern

# Auch die Ergebnisse von Funktionen koennen in einer Variable gespeichert werden
MeanMyVector <- mean(MyVector)

# Ergebnis aufrufen
MeanMyVector
[1] 2

Matrizen erstellen

MyVector
[1] 1 2 3
# Zeilen (rows) verbinden
MyMatrix <- rbind(MyVector, MyVector, MyVector)
MyMatrix
         [,1] [,2] [,3]
MyVector    1    2    3
MyVector    1    2    3
MyVector    1    2    3
# Spalten (columns) verbinden
MyMatrix <- cbind(c(1,0,0), c(0,1,0), c(0,1,0))
MyMatrix
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    1
[3,]    0    0    0
# Wenn ihr MyMatrix in der Arbeitsumgebung anklickt,
# zeigt R euch auch eure Datenmatrix

Variablenklassen I

# Die Klasse einer Variable herausfinden:
# Die class() Funktion 
Number <- 3
class(Number)
[1] "numeric"
# Auch das Ergebnis dieser Funktion kann ich in einer neuen Variable speichern
ClassOfNumber <- class(Number)

# Und was hat das Ergebnis für eine Klasse? 
class(ClassOfNumber)
[1] "character"
# Auch dieses Ergebnis könnte ihr wieder in einer Variable speichern
ClassOfClassOfNumber <- class(ClassOfNumber)
ClassOfClassOfNumber
[1] "character"

Weitere Funktionen

mean(MyVector)
[1] 2
min(MyVector)
[1] 1
max(MyVector)
[1] 3
sd(MyVector)
[1] 1
summary(MyVector)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    1.0     1.5     2.0     2.0     2.5     3.0 
length(MyVector)
[1] 3
# Schaut mal in die Hilfeseiten für diese Funktionen hinein (?Funktionsname)

Rechnen mit R

Rechnen und speichern

# Ich kann auch etwas auf einen Variablenwert aufaddieren und dies in der selben Variable speichern
# (der alte Wert ist dann aber geloescht)
Number
[1] 3
Number <- Number + 8
Number
[1] 11

Rechnen mit character-Variablen

# Anführungszeichen markieren für R eine character-Variable
Number <- "3"

# Das geht nicht
Number <- Number + 8
Error in Number + 8: nicht-numerisches Argument für binären Operator
class(Number)
[1] "character"
# Die Funktion as.numeric() wandelt eine andere Variablenklasse in einen numerischen Wert um
Number <- as.numeric(Number)
class(Number)
[1] "numeric"
# Jetzt geht es wieder
Number <- Number + 8
Number
[1] 11
# Es muss aber eine moegliche Umformung sein
as.numeric("a")
[1] NA

Rechnen mit Matrizen

# Matrizenrechnung ist auch moeglich
MyMatrix
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    1    1
[3,]    0    0    0
MyMatrix - 1 
     [,1] [,2] [,3]
[1,]    0   -1   -1
[2,]   -1    0    0
[3,]   -1   -1   -1
# Ich kann alle Berechnungen in einer neuen Variable speichern
MyNewMatrix <- MyMatrix + 3
MyNewMatrix
     [,1] [,2] [,3]
[1,]    4    3    3
[2,]    3    4    4
[3,]    3    3    3

Dataframes

MyNewMatrix
     [,1] [,2] [,3]
[1,]    4    3    3
[2,]    3    4    4
[3,]    3    3    3
class(MyNewMatrix)
[1] "matrix" "array" 
# Wenn man mit (Forschungs-)Datensaetzen arbeitet, bietet es sich meistens an diese als dataframe 
# zu speichern, da bei der Matrix-Klasse alle Werte die gleiche Datenklasse haben muessen
MyNewMatrix <- data.frame(MyNewMatrix)
class(MyNewMatrix)
[1] "data.frame"
# Bei dataframes kann jede Spalte eine eigene Datenklasse haben

Dataframes erstellen

# Hier erstellen wir einen dataframe mit drei Spalten: x, y und z
# Spalte x hat die Klasse numeric (bedeutet 1 bis 3)
# Spalte y hat die Klasse character
# Spalte z hat die Klasse logical
my_df <- data.frame(
  x = 1:3,
  y = c("a", "b", "c"),
  z = c(T,F,F)
)

my_df
  x y     z
1 1 a  TRUE
2 2 b FALSE
3 3 c FALSE

Data.frames erstellen

# Alternativ ginge es auch so:
x <- 1:3
y <- c("a", "b", "c")
z <- c(T,F,F)

my_df <- data.frame(x,y,z)
my_df
  x y     z
1 1 a  TRUE
2 2 b FALSE
3 3 c FALSE

Arbeiten mit data.frames

# Mit eckigen Klammern kann ich auch spezifische Elemente eines dataframes adressieren
# Zeilen und Spalten werden dabei mit einem Komma getrennt: [Zeile, Spalte]
# Die Zeilen und Spalten sind dafuer durchnummeriert
my_df[1,2]
[1] "a"
# Wenn ich einen der Werte leer lasse, bekomme ich die komplette Zeile oder Spalte ausgegeben
my_df[1,]
  x y    z
1 1 a TRUE
my_df[,2]
[1] "a" "b" "c"

Arbeiten mit data.frames

# Wenn Spalten und/oder Zeilen benannt sind, können auch die Namen verwendet werden
# Wir haben die Spalten mit x, y und z benannt, die Zeilen haben keine Namen
my_df[1,"x"]
[1] 1
# Wenn man mehrere Zeilen oder Spalten auf einmal aufrufen möchte, muss
# man wieder die combine-Funktion verwenden
my_df[c(1,2), c("x","y")]
  x y
1 1 a
2 2 b
# Um benannte Spalten einzeln aufzurufen, gibt es noch den $ Operator
my_df$x
[1] 1 2 3
# entspricht:
my_df[,"x"]
[1] 1 2 3

Arbeiten mit data.frames

# Hier kriegen wir einen Warnhinweis:
mean(my_df)
Warning in mean.default(my_df): Argument ist weder numerisch noch boolesch:
gebe NA zurück
[1] NA
# Aber wenn wir nur die numerische Spalte verwenden, funktioniert es:
mean(my_df[,"x"])
[1] 2
# Was könnte der Wert bei logischen Daten bedeuten?
mean(my_df[,"z"])
[1] 0.3333333

Übungsaufgaben

Datensatz

# Jetzt erstellen wir einen Übungsdatensatz:
names <- c("Robert", "Christian", "Nancy", "Annalena", "Marco", "Hubertus", "Boris", "Cem", "Lisa", "Karl", "Volker", "Steffi", "Bettina", "Svenja", "Klara", "Wolfgang")
gender = factor(c("m", "m", "w", "w", "m", "m", "m", "m", "w", "m", "m", "w", "w", "w", "w", "m"))
age = c(54, 44, 53, 43, 46, 51, 63, 58, 55, 60, 53, 55, 55, 55, 47, 53)

# Die IQ-Werte werden anhand einer Normalverteilung zufällig generiert
# Indem wir den seed festlegen, bekommen wir alle die gleichen Zufallszahlen
set.seed(3425)
iq = rnorm(16, mean = 100, sd = 15)

# Jetzt erstellen wir den data.frame
sample_data <- data.frame(names,gender,age,iq)

Die Aufgaben

  1. Berechnet das Durchschnittsalter und den Durchschnitts-IQ für unseren Datensatz
  2. Die table()-Funktion hilft Häufigkeiten auszuzählen. Zählt die Anzahl der männlichen und weiblichen Personen aus. Schaut euch, wenn nötig, die Hilfeseite der table()-Funktion.

Die Lösung

[1] 52.8125
[1] 100.7334

m w 
9 7 

Bibliotheken / Packages

Bibliotheken / Packages

  • Bibliotheken sind Sammlungen von R-Funktionen, Datensätzen und Code, die die Funktionalität von base R erweitern

  • Bibliotheken müssen zunächst pro System einmal installiert werden

  • Anschließend können sie geladen und dann genutzt werden

Beispielbibliothek: psych

  • Die psych-Bibliothek beinhaltet verschiedenste Funktionen für die Datenauswertung, Ausreißeranalyse und zur Test- und Fragebogenkonstruktion (Faktorenanalyse, Cronbach’s Alpha, etc.)
# Bei der ersten Nutzung muss die Bibliothek zunächst installiert werden:
install.packages("psych")

# Um die Bibliothek zu nutzen, muss sie dann in jeder R-Instanz neu geladen werden
library(psych)

Beispielbibliothek: psych

# Die describe-Funktion bietet einen Überblick über verschiedene Kennwerte der Variablen des Datensatzes
describe(sample_data)
        vars  n   mean    sd median trimmed   mad   min    max range  skew
names*     1 16   8.50  4.76   8.50    8.50  5.93  1.00  16.00 15.00  0.00
gender*    2 16   1.44  0.51   1.00    1.43  0.00  1.00   2.00  1.00  0.23
age        3 16  52.81  5.54  53.50   52.79  2.97 43.00  63.00 20.00 -0.20
iq         4 16 100.73 15.99  98.41  100.84 15.03 70.57 129.36 58.79 -0.10
        kurtosis   se
names*     -1.43 1.19
gender*    -2.07 0.13
age        -0.82 1.39
iq         -0.82 4.00
# Die violin-Funktion erstellt Violin-plots
violin(age ~ gender, data = sample_data)

Itemanalyse nach KTT mit der psych-Bibliothek

Datenfile runterladen



Hier klicken um den Datensatz runterzuladen

Einen Datensatz laden

# Durch das R-Projekt weiß in welchem Ordner es nach der Datei suchen muss
# Mit der read()-Funktion können wir einen Datensatz aus einer csv-Datei einlesen
fb_data <- read.csv2(file.path("dateien", "Daten Fragebogen.csv"))

# Alternativ kann man den Datensatz auch direkt aus dem Internet importieren:
fb_data <- read.csv2(file.path("https://jannisbosch.github.io/R-Tutorial/dateien/Daten%20Fragebogen.csv"))

# Die head()-Funktion ermöglicht uns einen Überblick über die Variablen im Datensatz
head(fb_data)
  Upn Alter gesch spq1 spq2 spq3 spq4 spq5 spq6 spq7 spq8 spq9 spq10 spq11
1   1    22     1    0    1    0    3    2    1    1    3    0     0     2
2   2    22     1    2    0    1    1    1    0    2    2    0     0     0
3   3    27     1    3    1    1    1    1    1    2    0    1     1     1
4   4    30     0    3    1    2    3    3    3    1    3    3     2     2
5   5    23     0    3    1    1    3    1    0    3    2    3     2     1
6   6    25     0    0    0    0    0    0    0    0    1    2     0     0
  spq12 spq13 spq14 spq15 spq16 spq17 spq18 spq19 spq20 spq21 spq22 spq23 spq24
1     0     2     1     2     3     4     0     0     0     1     0     3     3
2     0     0     0     0     3     1     1     2     0     1     0     1     0
3     0     0     0     2     1     1     0     0     1     0     0     0     1
4     1     2     1     3     4     2     1     1     3     1     0     3     3
5     1     1     0     2     3     0     0     2     2     0     1     3     1
6     0     0     0     0     3     0     0     2     0     2     0     2     3
  spq25 spq26 spq27 spq28 spq29 spq30 spq31 spq32 spq33 spq34 spq35 spq36 spq37
1    NA     1     0     3     3     0     4     2     4     3     3     0     0
2     1     1     0     1     2     0     2     1     3     3     1     0     0
3     1     0     2     1     0     0     0     0     0     1     1     1     0
4     4     1     3     3     1     1     1     2     3     3     1     1     3
5     1     0     3     0     1     0     0     1     0     0     0     0     0
6     2     0     0     0     0     2     0     0     0     0     0     0     0
  spq38 spq39 spq40 spq41 spq42 spq43 spq44 spq45 spq46 spq47 spq48 spq49 spq50
1     0     0     3     0     3     1     0     3     2     0     0     0     3
2     4     0     2     0     2     1     1     1     2     0     0     0     2
3     1     0     0     0     1     0     1     1     0     0     0     1     1
4     3     1     2     3     1     2     1     1     2     1     0     0     2
5     1     0     0     0     0     0     0     0     1     0     0     0     0
6     0     0     0     0     0     0     0     0     0     0     0     0     0
  spq51 spq52 spq53 spq54 spq55 spq56 spq57 spq58 spq59 spq60 spq61 spq62 spq63
1     1     3     0     3     1     1     4     3     0     0     0     0     0
2     1     0     1     0     0     3     1     3     0     0     3     0     0
3     0     2     1     2     0     0     2     1     0     0     2     0     1
4     3     3     2     1     1     2     3     4     1     1     1     1     3
5     0     0     1     2     0     0     2     1     0     0     0     0     2
6     0     2     0     0     0     0     2     0     0     0     0     0     0
  spq64 spq65 spq66 spq67 spq68 spq69 spq70 spq71 spq72 spq73 spq74
1     3     2     3     3     3     3     0     1     0     4     1
2     1     0     1     2     2     1     2     0     3     1     0
3     0     0     2     0     0     1     0     0     0     2     0
4     3     3    NA     2     1     3     3     2     3     3     1
5     0     0     0     0     0     0     2     0     1     0     0
6     0     0     2     0     0     0     0     0     0     4     0
# Was beinhaltet der Datensatz?

Die Skalen

Hier klicken um die Skalen runterzuladen

Die Itemanalyse (nach klassischer Testtheorie)

# Berechnung der Skala Odd Believes & Magical Thinking - Items 3, 12, 21, 30, 39, 47, 55

# Zunächst schauen wir uns mit Hilfe der alpha()-Funktion aus der psych-Bibliothek 
# das Cronbach's Alpha und weitere Parameter für die Itemanalyse an
alpha(fb_data[,c("spq3", "spq12", "spq21", "spq30", "spq39", "spq47", "spq55")])

Reliability analysis   
Call: alpha(x = fb_data[, c("spq3", "spq12", "spq21", "spq30", "spq39", 
    "spq47", "spq55")])

  raw_alpha std.alpha G6(smc) average_r S/N  ase mean sd median_r
       0.9       0.9    0.91      0.55 8.7 0.02  1.1  1     0.55

    95% confidence boundaries 
         lower alpha upper
Feldt     0.85   0.9  0.93
Duhachek  0.86   0.9  0.94

 Reliability if an item is dropped:
      raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
spq3       0.87      0.87    0.87      0.52 6.4    0.026 0.017  0.55
spq12      0.88      0.88    0.89      0.54 7.2    0.024 0.023  0.55
spq21      0.89      0.89    0.90      0.57 8.1    0.022 0.023  0.60
spq30      0.88      0.88    0.89      0.56 7.5    0.023 0.016  0.55
spq39      0.91      0.91    0.91      0.61 9.6    0.019 0.011  0.64
spq47      0.87      0.87    0.87      0.53 6.8    0.025 0.017  0.55
spq55      0.88      0.88    0.89      0.55 7.2    0.023 0.026  0.56

 Item statistics 
       n raw.r std.r r.cor r.drop mean  sd
spq3  57  0.89  0.89  0.89   0.84 1.18 1.3
spq12 57  0.83  0.82  0.78   0.74 1.54 1.4
spq21 57  0.72  0.73  0.67   0.63 0.98 1.1
spq30 57  0.79  0.78  0.75   0.71 0.95 1.3
spq39 57  0.60  0.62  0.53   0.49 0.70 1.1
spq47 57  0.86  0.85  0.85   0.78 1.00 1.4
spq55 57  0.81  0.81  0.77   0.73 1.04 1.4

Non missing response frequency for each item
         0    1    2    3    4 miss
spq3  0.44 0.19 0.16 0.18 0.04    0
spq12 0.32 0.23 0.18 0.16 0.12    0
spq21 0.40 0.37 0.11 0.09 0.04    0
spq30 0.54 0.18 0.12 0.11 0.05    0
spq39 0.61 0.19 0.09 0.09 0.02    0
spq47 0.58 0.14 0.07 0.12 0.09    0
spq55 0.54 0.16 0.12 0.07 0.11    0

Einen Skalenmittelwert berechnen

# Die rowMeans()-Funktion berechnet zeilenweise den Mittelwert für den Datensatz im Eingabeargument
# Diese Datenreihe von Mittelwerten wird dann als neue Spalte OBMT in unserem Datensatz gespeichert
fb_data[,"OBMT"] <- rowMeans(fb_data[,c("spq3", "spq12", "spq21", "spq30", "spq39", "spq47", "spq55")], na.rm = T)

fb_data[,"OBMT"]
 [1] 0.2857143 0.2857143 0.1428571 1.1428571 0.2857143 0.5714286 0.8571429
 [8] 0.1428571 0.7142857 0.0000000 3.1428571 1.2857143 0.0000000 2.0000000
[15] 0.2857143 2.8571429 1.7142857 0.5714286 0.0000000 1.5714286 1.2857143
[22] 0.4285714 0.1428571 3.0000000 0.2857143 1.7142857 2.4285714 1.2857143
[29] 0.4285714 0.2857143 0.0000000 0.4285714 2.7142857 0.5714286 0.0000000
[36] 0.2857143 0.0000000 1.4285714 0.0000000 0.1428571 0.7142857 0.4285714
[43] 1.4285714 0.7142857 1.5714286 0.1428571 0.0000000 0.8571429 1.4285714
[50] 1.2857143 3.2857143 1.7142857 0.8571429 3.5714286 2.5714286 2.2857143
[57] 2.5714286

Übungsaufgabe

  1. Berechnet das Cronbach’s Alpha für die Excessive Social Anxiety Skala

  2. Berechnet den Skalenmittelwert der Excessive Social Anxiety Skala für jede einzelne Person

  3. Berechnet den Stichprobenmittelwert für die Excessive Social Anxiety Skala

Lösung 1


Reliability analysis   
Call: alpha(x = fb_data[, c("spq2", "spq11", "spq20", "spq29", "spq38", 
    "spq46", "spq54", "spq71")])

  raw_alpha std.alpha G6(smc) average_r S/N   ase mean   sd median_r
      0.82      0.83    0.84      0.39 5.1 0.035  1.2 0.77     0.39

    95% confidence boundaries 
         lower alpha upper
Feldt     0.75  0.82  0.89
Duhachek  0.76  0.82  0.89

 Reliability if an item is dropped:
      raw_alpha std.alpha G6(smc) average_r S/N alpha se var.r med.r
spq2       0.81      0.82    0.82      0.40 4.7    0.038 0.024  0.41
spq11      0.81      0.82    0.82      0.39 4.5    0.039 0.024  0.39
spq20      0.84      0.85    0.85      0.45 5.7    0.032 0.012  0.44
spq29      0.79      0.80    0.80      0.36 4.0    0.043 0.018  0.38
spq38      0.79      0.80    0.81      0.37 4.1    0.042 0.020  0.37
spq46      0.79      0.80    0.79      0.36 3.9    0.042 0.016  0.37
spq54      0.81      0.82    0.82      0.39 4.6    0.038 0.026  0.41
spq71      0.79      0.80    0.81      0.37 4.1    0.042 0.025  0.38

 Item statistics 
       n raw.r std.r r.cor r.drop mean   sd
spq2  56  0.62  0.63  0.55   0.49 0.96 1.06
spq11 57  0.67  0.67  0.61   0.54 1.09 1.15
spq20 57  0.46  0.44  0.31   0.28 1.56 1.24
spq29 57  0.76  0.77  0.75   0.68 0.93 1.05
spq38 57  0.75  0.75  0.72   0.64 1.42 1.25
spq46 57  0.77  0.78  0.78   0.69 0.98 0.99
spq54 57  0.68  0.65  0.57   0.52 1.84 1.45
spq71 57  0.73  0.75  0.70   0.65 1.00 0.96

Non missing response frequency for each item
         0    1    2    3    4 miss
spq2  0.43 0.32 0.11 0.14 0.00 0.02
spq11 0.40 0.30 0.12 0.16 0.02 0.00
spq20 0.23 0.33 0.14 0.25 0.05 0.00
spq29 0.47 0.23 0.19 0.11 0.00 0.00
spq38 0.30 0.28 0.18 0.19 0.05 0.00
spq46 0.39 0.35 0.16 0.11 0.00 0.00
spq54 0.30 0.09 0.23 0.25 0.14 0.00
spq71 0.37 0.35 0.19 0.09 0.00 0.00

Lösung 2

 [1] 1.5000000 1.0000000 0.7500000 1.8750000 1.1250000 0.0000000 1.6250000
 [8] 1.0000000 1.7500000 2.6250000 1.0000000 3.2500000 0.0000000 2.2500000
[15] 0.7500000 0.0000000 2.2500000 0.5000000 0.6250000 1.0000000 1.3750000
[22] 0.2500000 1.7500000 1.6250000 1.6250000 1.8750000 0.8750000 0.8571429
[29] 0.3750000 1.0000000 1.0000000 1.8750000 1.3750000 0.5000000 0.6250000
[36] 0.2500000 0.1250000 1.5000000 0.3750000 1.6250000 0.7500000 0.6250000
[43] 0.8750000 1.3750000 1.2500000 1.0000000 1.8750000 2.8750000 1.1250000
[50] 2.6250000 0.6250000 1.5000000 2.5000000 0.0000000 1.3750000 1.2500000
[57] 2.3750000

Lösung 3

[1] 1.223371